﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using LASMobile.Classes;
using LASMobile.LASDBClasses;

namespace LASMobile
{
    public partial class InformacionDelArticulo : System.Web.UI.Page
    {
        private readonly LASDBDataContext _db = new LASDBDataContext();
        private List<Bodega> _bodegas = new List<Bodega>();
        private List<Articulo> _articulos = new List<Articulo>();
        private Bodegas_has_Articulo _articuloActual;
        private int _companyId;
        private Usuario _usuario;
        
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session[Constants.SESSION_USER]!=null)
            {
                _usuario = (Usuario)Session[Constants.SESSION_USER];
                _companyId = _usuario.Empresa.IdEmpresa;
            }
            else
            {
                Response.Redirect("Default.aspx", true);
            }

            _bodegas = GetStorageRoomsFromCompany(_companyId).ToList();
            _articulos = GetProductsFromCompany(_companyId).ToList();
           
            if(!IsPostBack)
            {
                BodegaDropDownList.DataSource = _bodegas.Select(bodega => bodega.NombreBodega);
                ArticuloDropDownList.DataSource = _articulos.Select(articulo => articulo.CodigoUnico);
                BodegaDropDownList.DataBind();
                ArticuloDropDownList.DataBind();
            }
            
            
            ActualizarGUI();
        }


        
        private void ActualizarGUI()
        {
            if (BodegaDropDownList.SelectedIndex == -1 || ArticuloDropDownList.SelectedIndex == -1) return;

            var bodega = _bodegas[BodegaDropDownList.SelectedIndex];
            var articulo = _articulos[ArticuloDropDownList.SelectedIndex];

            _articuloActual = GetStorageRoomProduct(bodega.IdBodega, articulo.IdArticulo);

            DisponibleTextBox.Text = _articuloActual.Cantidade.Disponible.ToString();
            SolicitadoTextBox.Text = _articuloActual.Cantidade.Solicitado.ToString();
            StockTextBox.Text = _articuloActual.Cantidade.Stock.ToString();
            ComprometidoTextBox.Text = _articuloActual.Cantidade.Comprometido.ToString();

            imagen.ImageUrl = "~/Handler.ashx?idProducto="+ articulo.IdArticulo +"&idFoto=0";

            hidden.Value = 0+"";
        }

        /// <summary>
        /// Evento que se dispara en las selección de un nuevo item del combobox
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void CambioDeArticulo(object sender, EventArgs e)
        {
            ActualizarGUI();
        }

        protected void Ggeo9_Click(object sender, ImageClickEventArgs e)
        {
            if (_articuloActual == null) return;

            try
            {
                if (int.Parse(hidden.Value)-1 < 0) return;
            }
            catch
            {

            }

            imagen.ImageUrl = "~/Handler.ashx?idProducto=" + _articuloActual.Articulo.IdArticulo + "&idFoto=" + (int.Parse(hidden.Value)-1);    
        }

        protected void Ggeo10_Click(object sender, ImageClickEventArgs e)
        {
            if (_articuloActual == null) return;

            var max = _articuloActual.Articulo.Fotos.ToList().Count - 1;

            try
            {
                if (int.Parse(hidden.Value)+1 > max) return;
            }
            catch
            {

            }

            imagen.ImageUrl = "~/Handler.ashx?idProducto=" + _articuloActual.Articulo.IdArticulo + "&idFoto=" + (int.Parse(hidden.Value)+1);
        }

        #region Métodos LINQ-TO-SQL
        /// <summary>
        /// Metodo que permite obtener la lista de bodegas
        /// </summary>
        /// <param name="companyId"></param>
        /// <returns></returns>
        private List<Bodega> GetStorageRoomsFromCompany(int companyId)
        {
            List<Bodega> listaBodegas = null;

            try
            {
                var resultado = from bodega in _db.Bodegas
                                where bodega.IdEmpresa == companyId
                                select bodega;
                listaBodegas = resultado.ToList();
            }
            catch
            {
                //TODO: Error al recuperar los articulos
            }

            return listaBodegas;
        }



        private IEnumerable<Articulo> GetProductsFromCompany(int companyId)
        {
            List<Articulo> listaDeArticulos = null;

            try
            {
                var resultado = from articulo in _db.Articulos
                                join articulosEnBodegas in _db.Bodegas_has_Articulos on articulo.IdArticulo equals
                                    articulosEnBodegas.IdArticulo
                                join bodega in _db.Bodegas on articulosEnBodegas.IdBodega equals bodega.IdBodega
                                join empresaActual in _db.Empresas on bodega.IdBodega equals empresaActual.IdEmpresa
                                where empresaActual.IdEmpresa == companyId
                                select articulo;
                listaDeArticulos = resultado.ToList();
            }
            catch
            {
                //TODO: Error al recuperar los articulos
            }
            return listaDeArticulos;
        }

        /// <summary>
        /// Método que regresa un atículo por bodega a partir del id de la bodega y el id del producto
        /// </summary>
        /// <param name="storageRoomId"></param>
        /// <param name="productId"></param>
        /// <returns></returns>
        private Bodegas_has_Articulo GetStorageRoomProduct(int storageRoomId, int productId)
        {
            Bodegas_has_Articulo articuloEnBodegaFinal = null;

            try
            {
                var resultado = (from articuloEnBodega in _db.Bodegas_has_Articulos
                                 where articuloEnBodega.IdBodega == storageRoomId & articuloEnBodega.IdArticulo == productId
                                 select articuloEnBodega).Single();
                articuloEnBodegaFinal = resultado;
            }
            catch
            {
                //TODO: Error al recuperar los articulos
            }

            return articuloEnBodegaFinal;
        }

        public static byte[] GetImage(int idProducto, int idFoto)
        {
            var db = new LASDBDataContext();
            
            var image = (from articulo in db.Articulos
                         where articulo.IdArticulo == idProducto
                         select articulo).Single();
            return image.Fotos[idFoto].Foto1.ToArray();
        }
        #endregion

        protected void CloseSession(object sender, EventArgs e)
        {
            Session[Constants.SESSION_USER]=null;
            Session[Constants.SESSION_SALE] = null;
            Response.Redirect("Default.aspx", true);
        }
    }
}